In [245]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
In [5]:
original_data = pd.read_csv('iris.csv')
In [6]:
original_data.head()
Out[6]:
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
0 1 5.1 3.5 1.4 0.2 Iris-setosa
1 2 4.9 3.0 1.4 0.2 Iris-setosa
2 3 4.7 3.2 1.3 0.2 Iris-setosa
3 4 4.6 3.1 1.5 0.2 Iris-setosa
4 5 5.0 3.6 1.4 0.2 Iris-setosa
In [7]:
set(original_data.Species)
Out[7]:
{'Iris-setosa', 'Iris-versicolor', 'Iris-virginica'}
In [8]:
data = original_data.replace({ 'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2})
In [9]:
data
Out[9]:
Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
0 1 5.1 3.5 1.4 0.2 0
1 2 4.9 3.0 1.4 0.2 0
2 3 4.7 3.2 1.3 0.2 0
3 4 4.6 3.1 1.5 0.2 0
4 5 5.0 3.6 1.4 0.2 0
... ... ... ... ... ... ...
145 146 6.7 3.0 5.2 2.3 2
146 147 6.3 2.5 5.0 1.9 2
147 148 6.5 3.0 5.2 2.0 2
148 149 6.2 3.4 5.4 2.3 2
149 150 5.9 3.0 5.1 1.8 2

150 rows × 6 columns

In [44]:
X = data.iloc[:, 1:-1]
y = data.Species
In [84]:
lda = LinearDiscriminantAnalysis()
lda_transformed_data = lda.fit_transform(X, y)
In [85]:
lda_transformed_data.shape
Out[85]:
(150, 2)
In [86]:
_ = plt.scatter(lda_transformed_data[:, 0], lda_transformed_data[:, 1], c=y)
In [95]:
tree = DecisionTreeClassifier(min_samples_split=10, max_depth=None)
tree.fit(lda_transformed_data, y)
Out[95]:
DecisionTreeClassifier(min_samples_split=10)
In [96]:
tree.score(lda_transformed_data, y)
Out[96]:
0.9866666666666667
In [97]:
def draw_contour(clf, X):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    plot_step = 100
    
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, plot_step),
    np.linspace(y_min, y_max, plot_step))
    
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    
#     print(Z)
    Z = Z.reshape(xx.shape)
    cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.3)
In [98]:
draw_contour(tree, lda_transformed_data)
_ = plt.scatter(lda_transformed_data[:, 0], lda_transformed_data[:, 1], c=y)
In [147]:
reduced_X = X.loc[:, ['SepalLengthCm', 'PetalLengthCm']]

tree_2 = DecisionTreeClassifier(min_samples_split=2, max_depth=None)
tree_2.fit(reduced_X, y)
tree_2.score(reduced_X, y)
Out[147]:
0.9933333333333333
In [148]:
draw_contour(tree_2, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)
In [158]:
bc_tree = DecisionTreeClassifier(min_samples_split=5, max_depth=3)
bc = BaggingClassifier(bc_tree, n_estimators=100, max_samples=0.4)
bc.fit(reduced_X, y)
bc.score(reduced_X, y)
Out[158]:
0.9533333333333334
In [159]:
draw_contour(bc, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)
In [180]:
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(lda_transformed_data, y)
knn.score(lda_transformed_data, y)
Out[180]:
0.9733333333333334
In [181]:
draw_contour(knn, lda_transformed_data)
_ = plt.scatter(lda_transformed_data[:, 0], lda_transformed_data[:, 1], c=y)
In [206]:
ab_tree = DecisionTreeClassifier(min_samples_split=5, max_depth=2)
ab = AdaBoostClassifier(ab_tree, n_estimators=50)
ab.fit(reduced_X, y)
ab.score(reduced_X, y)
Out[206]:
0.9933333333333333
In [207]:
draw_contour(ab, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)
In [215]:
rf = RandomForestClassifier(n_estimators=100, min_samples_split=10, max_depth=None)
rf.fit(reduced_X, y)
rf.score(reduced_X, y)
Out[215]:
0.9666666666666667
In [216]:
draw_contour(rf, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)
In [229]:
ab_tree_2 = DecisionTreeClassifier(min_samples_split=5, max_depth=3)
ab_2 = AdaBoostClassifier(ab_tree_2, n_estimators=50)
bc_2 = BaggingClassifier(ab_2, n_estimators=100, max_samples=0.4)
bc_2.fit(reduced_X, y)
bc_2.score(reduced_X, y)
Out[229]:
0.9666666666666667
In [231]:
draw_contour(bc_2, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)
In [242]:
ab_tree_2 = DecisionTreeClassifier(min_samples_split=5, max_depth=3, class_weight={0: 20, 1: 1, 2: 1})
ab_2 = AdaBoostClassifier(ab_tree_2, n_estimators=50)
bc_2 = BaggingClassifier(ab_2, n_estimators=50, max_samples=0.4)
bc_2.fit(reduced_X, y)
bc_2.score(reduced_X, y)
Out[242]:
0.9733333333333334
In [243]:
draw_contour(bc_2, reduced_X.values)
_ = plt.scatter(reduced_X.values[:, 0], reduced_X.values[:, 1], c=y)